import datetime as dt
from typing import Self

from pydantic import Field, model_validator

from .base import Base
from .resume_id import ResumeWorkId


class BaseResumeWork(Base):
    start_work: int = Field(..., description='Год начала работы')
    end_work: str = Field(..., description='Год окончания работы')
    position: str = Field(..., description='Позиция')
    company: str = Field(..., description='Компания')
    workplace: str = Field(
        ...,
        description='Обязаности на рабочем месте'
    )

    @model_validator(mode='after')
    def valid_year_work(self) -> Self:
        try:
            end_work = int(self.end_work)
        except ValueError:
            return self

        if end_work < self.start_work:
            raise ValueError(
                'Год окончания работы '
                'не должен быть меньше года начала работы!'
            )

        if end_work > dt.datetime.now().year:
            raise ValueError(
                'Год окончания работы больше текущего года'
            )
        return self


class ResumeWorkCreate(BaseResumeWork):
    pass


class ResumeWorkResult(BaseResumeWork):
    id: ResumeWorkId = Field(
        ...,
        description='Уникальный идентификатор'
    )


class ResumeWorkUpdate(BaseResumeWork):
    start_work: int | None = Field(None, description='Год начала работы')
    end_work: str | None = Field(None, description='Год окончания работы')
    position: str | None = Field(None, description='Позиция')
    company: str | None = Field(None, description='Компания')
    workplace: str | None = Field(
        None,
        description='Обязаности на рабочем месте'
    )

    @model_validator(mode='after')
    def valid_year_work(self) -> Self:
        if self.start_work is not None and self.end_work is not None:
            return super().valid_year_work()  # noqa
        return self
